/**
 * Fichier DaoGenerique.java : Définition de classe
 * fr.unice.gnpt.core.dao.DaoGenerique : Interface DaoGenerique
 * 
 * Auteurs : Groupe GNPT : Gastinel, Nicolas, Pellegrino, Trovato
 */
package fr.unice.gnpt.core.dao;

import java.io.Serializable;
import java.util.Collection;

import fr.unice.gnpt.core.dao.connexion.Connexion;

/**
 * Interface de type CRUD (Create, Read, Update, Delete) indiquant les méthodes
 * que tout DAO doit au minimum implémenter quelque soit le système de
 * persistance.
 * 
 * @author gnpt
 * @version 0.0.1
 * 
 * @param <T>
 *            le type d'objet associé au DAO.
 * @param <ID>
 *            le type de l'identifiant unique associé à l'objet de type
 *            <code>T</code>.
 */
public interface DaoGenerique<T, ID extends Serializable> {
	/**
	 * Ajoute au système de persistance l'entité passé en paramètre.
	 * 
	 * @param entite
	 *            l'entité à insérer.
	 * @throws DaoException
	 */
	void create(T entite) throws DaoException;

	/**
	 * Renvoie tous les objets associé au type <code>T</code> du DAO contenus
	 * dans le système de persistance.
	 * 
	 * @return une collection de tous les objets associé au type <code>T</code>
	 *         du DAO trouvés dans le système de persistance, ou
	 *         <code>null</code> si aucune entité n'a été trouvée.
	 * @throws DaoException
	 */
	Collection<T> findAll() throws DaoException;

	/**
	 * Met à jour dans le système de persistance l'entité de type <code>T</code>
	 * .
	 * 
	 * @param entite
	 *            l'entité à mettre à jour.
	 * @return une instance de l'objet qui a été mis à jour.
	 * @throws DaoException
	 */
	T update(T entite) throws DaoException;

	/**
	 * Supprime du système de persistance l'entité passée en paramètre.
	 * 
	 * @param entite
	 *            l'entité à supprimer.
	 * @throws DaoException
	 */
	void delete(T entite) throws DaoException;

	/**
	 * Accesseur pour récupérer la connexion associée au DAO.
	 * 
	 * @return la connexion associée au DAO.
	 */
	public Connexion<?> getConnexion();

	/**
	 * Mutateur pour modifier la connexion associée au DAO.
	 * 
	 * @param connexion
	 *            la nouvelle associée au DAO.
	 */
	public void setConnexion(Connexion<?> connexion);
}
